/* let num: unknown = 88
num = 'abc'
console.log(num)
// 编译成 JS 会报错
// num() // error: 不能调用方法
// console.log(num.length) // error: 不能访问属性 */

// 有时候可以使用【类型收窄】来处理 unknown 类型的使用
/* let num: unknown = 88
num = 'abc'
console.log(num)
// typeof 判断类型就是类型收窄的一种方式
if (typeof num === 'function') {
  num()
}
if (typeof num === 'string') {
  console.log(num.length)
} */

// 并不是任何情况都能使用【类型收窄】
/* let num = 'hello' // num 的类型已经确定就是 string 类型
if (typeof num === 'string') {
  console.log(num.length)
} else if (typeof num === 'function') {
  // 如果再等于了 function 类型，那是不可能的，所以 num 被推断为了 never 类型
  num() // Error
} */

// 除了 typeof 可以做类型收窄，也可以使用断言来做类型收窄
/* let num: unknown = 88
num = 'abc'
console.log((num as string).length) */

/* let temp: unknown = 'hello'
// let str: string = temp // 这句话报错
// 处理方式1
// let str: unknown = temp
// 处理方式2
// let str: any = temp
// 处理方式2
let str: string = temp as string */

// 如何把 string 给 number
let temp: string = '888'
// 下面写法肯定会报错
// let n1: number = temp
// 可以断言为 any
// let n1: number = temp as any
// 可以先断言为 unknown 在断言为 number
let n1: number = temp as unknown as number
// 两个毫无关系的类型间不能相互断言
// let n1: number = temp as number
